//
//  ViewController.m
//  RuntimeDemo
//
//  Created by pxh on 16/3/7.
//  Copyright © 2016年 上海益学. All rights reserved.
//

#import "ViewController.h"
#import <objc/runtime.h>
#import "BDPerson.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //运行时用于字典转模型的归档解档操作
    [self getClassAllMember];
    //通过objc_property_t获取所有成员的属性
    [self getClassAllMemberVariable];
    self.arrays = [NSMutableArray array];
    [self.arrays addObject:@"one"];
    [self.arrays addObject:@"two"];
    [self.arrays addObject:nil];
    NSLog(@"%@",self.arrays);
}
-(void)getClassAllMemberVariable{
    /**
     *  利用Runtime遍历一个类的全部成员变量
     *  1、导入<objc/runtime.h>
     *
     */
    unsigned int count = 0;
    //获取指向该类所有属性的指针
    objc_property_t* properties = class_copyPropertyList([BDPerson class], &count);
    for (int i = 0; i < count; i ++) {
        //获取每一个属性
        objc_property_t property = properties[i];
        //根据objc_property_t获取其属性的名称-->c语言的字符串
        const char* name = property_getName(property);
        NSString* key = [NSString stringWithUTF8String:name];
        NSLog(@"%d-----%@",i,key);
    }
}
-(void)getClassAllMember{
    //1、动态的便利一个类的所有成员，用于字典转模型归档解档操作  导入<objc/runtime.h>
    unsigned int count = 0;
    //Ivar:表示成员变量的类型
    Ivar* ivars = class_copyIvarList([BDPerson class], &count);//获取一个指向成员变量的指针
    for (int i = 0; i < count; i ++) {
        //获取 Ivar
        Ivar ivar = ivars[i];   //根据ivar获取成员变量的名称---->c语言字符串
        const char* name = ivar_getName(ivar);
        NSString* key = [NSString stringWithUTF8String:name];
        NSLog(@"%d------%@",i,key);
    }

}
/**
 *  利用遍历类的属性，来快速的进行归档操作
 *  将从网络上下载的json数据进行字典转模型
 *  注意：归档解档需要遵守<NSCoding>协议，实现以下两个方法
 */

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
